import Request from 'luch-request';
import { baseUrl } from '@/config';
import { getCodeErr } from '@/utils/err_code';

const http = new Request({
	baseURL: baseUrl,
	timeout: 3 * 1000 // 默认3s
});
// 在请求之前拦截
http.interceptors.request.use(
	config => {
		const cf = config;
		cf.header['Client'] = 'app';
		if (uni.getStorageSync('token')) {
			cf.header['Authorization'] = uni.getStorageSync('token');
		}
		return cf;
	},
	config => {
		// 可使用async await 做异步操作
		return Promise.reject(config);
	}
);

// 在请求之后拦截
http.interceptors.response.use(
	response => {
		let { errHandle } = getCodeErr(response.data.code);
		errHandle && errHandle();
		return response.data;
	},
	response => {
		let err;
		if (response.statusCode) {
			let { errMessage, errHandle } = getCodeErr(response.statusCode);
			err = errMessage || response.data.message || response.errMsg;
			errHandle && errHandle();
		} else {
			err = '请求超时';
		}
		return {
			code: 500,
			message: err
		};
	}
);

export function post(url, data, params, timeout) {
	return http.request({
		method: 'POST',
		url,
		data,
		params,
		timeout
	});
}

export function get(url, params) {
	return http.request({
		method: 'GET',
		url,
		params
	});
}

export function put(url, data, params) {
	return http.request({
		method: 'PUT',
		url,
		data,
		params
	});
}

export function DELETE(url, data, params) {
	return http.request({
		method: 'DELETE',
		url,
		data,
		params
	});
}
/**
 * 上传文件
 * @param { String } url 服务器地址
 * @param { Object } config 配置
 * @param { Object } config.params 会加在url上
 * @param { Array } config.files 需要上传的文件列表。使用 files 时，filePath 和 name 不生效。App、H5（ 2.6.15+）
 * @param { String } config.fileType 仅支付宝小程序，且必填。
 * @param { String } config.filePath 要上传文件资源的路径
 * @param { Object } config.custom 可以加一些自定义参数，在拦截器等地方使用。比如这里我加了一个auth，可在拦截器里拿到，如果true就传token
 * @param { String } config.name 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
 * @param { Number } config.timeout H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)
 * @param { Object } config.header 会与全局header合并，如有同名属性，局部覆盖全局
 * @param { Object } config.formData HTTP 请求中其他额外的 form data
 * @param { Function } config.getTask 返回当前请求的task, options
 * task.onProgressUpdate进度监听 task.abort()关闭上传
 * 详见：https://github.com/lei-mu/luch-request/
 * */
export function upload(url, config) {
	config.timeout = 30 * 1000; // 上传文件为30s
	return http.upload(url, config);
}
export default http;
